#include "setup.h"

int main(int argc,char **argv){
   int shmid = shmget(MEM_CONDIVISA,sizeof(mem_shared),IPC_CREAT|0600);
   if(shmid == -1) perror("errore allocazione memoria condivisa");
   mem_shared* mem = shmat(shmid,NULL,0);//puntatore memoria condivisa
   int i;
   mem->operator = 0;//N.B all'inizializzazione ci sono 0 operatori
   int sem_id = semget(SEMAFORI,4,IPC_CREAT|0600);
   if (sem_id == -1)
	perror("errore inizializzazione semafori");
   semctl(sem_id,SEM_SALA,SETVAL,CAPIENZA);//semaforo coda
   semctl(sem_id,MUTEX,SETVAL,1);//Mutex
   semctl(sem_id,INIT,SETVAL,1);
   semctl(sem_id,CHIUSO,SETVAL,1);//APERTO inizializzato a false
   for(i=0; i<MAX;i++){
   	mem->coda[i] = msgget(CODA+i,IPC_CREAT|0600);
	if (mem->coda[i] == -1) perror("errore allocazione coda");
        pid_t padre = fork();
	if (mem->process[i].pid == -1) 
		perror("errore creazione operatori");
	else if(!padre)//se e un processo figlio{
	 execl("operatore","operatore",0);
         perror("errore inizializzazione figlio"); 
	}else {
	 mem->process[i].pid = padre;
	}	  
   }
   p(sem_id,INIT); // apre i battenti dopo aver inizializzato correttamente
   //aspetta che tutti i N operatori siano attivi
   struct sem_buf op;
   op.sem_num = CHIUSO;
   op.sem_op =-( MAX+1);
   op.sem_flg = 0;
   sem_op(sem_id,&op,1);
   //setta l'alarm al tempo di chiusura
   //si mette a dormire aspettando la chiusura
}
